---
title: "Go 慣用法與效能最佳化"
description: "Go 編碼規範、效能最佳化技巧、JS 對比與最佳實踐。"
---

# Go 慣用法與效能最佳化

本模組總結 Go 語言的慣用寫法、效能最佳化技巧，並與 JavaScript 進行對比，幫助你寫出高效、可維護的 Go 程式碼。

## 1. 編碼規範

- 變數命名採用駝峰式（小寫開頭）
- 套件名簡潔明瞭
- 每個檔案只包含一個套件
- 註解規範，推薦使用英文
- 使用 go fmt 自動格式化

<UniversalEditor title="命名與格式化對比" compare={true}>
```javascript !! js
// JavaScript: 命名風格
let user_name = 'Tom'; // 底線
```

```go !! go
// Go: 命名風格
var userName = "Tom" // 駝峰式
```
</UniversalEditor>

---

## 2. 效能最佳化技巧

- 盡量避免不必要的記憶體分配
- 使用 sync.Pool 複用物件
- 合理使用並發，避免過度建立 goroutine
- 使用 pprof 進行效能分析
- 避免濫用 interface{} 和反射

<UniversalEditor title="物件複用對比" compare={true}>
```javascript !! js
// JavaScript: 物件池較少用
const arr = [];
for(let i=0;i<1000;i++) arr.push({});
```

```go !! go
// Go: sync.Pool 物件池
import "sync"
var pool = sync.Pool{New: func() interface{} { return make([]byte, 1024) }}
for i := 0; i < 1000; i++ {
  b := pool.Get().([]byte)
  // 使用 b
  pool.Put(b)
}
```
</UniversalEditor>

---

## 3. 記憶體管理最佳化

- Go 自動 GC，但需注意大物件和長生命週期
- 避免記憶體洩漏（及時關閉 channel、回收 goroutine）
- 使用 escape analysis 工具分析記憶體分配

---

## 4. 並發效能最佳化

- 合理劃分 goroutine 數量，避免過度並發
- 使用 channel 控制並發流量
- 利用 sync.WaitGroup、sync.Mutex 保證並發安全

<UniversalEditor title="並發控制對比" compare={true}>
```javascript !! js
// JavaScript: 並發控制
Promise.all([...]) // 並發數不可控
```

```go !! go
// Go: 並發控制
import "sync"
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
  wg.Add(1)
  go func() {
    defer wg.Done()
    // ...
  }()
}
wg.Wait()
```
</UniversalEditor>

---

## 5. 程式碼組織原則

- 每個套件只做一件事（單一職責）
- main 套件只做啟動和依賴注入
- 業務邏輯分層（handler/service/repository）
- 合理拆分模組，避免巨型套件

---

## 6. 現代 Go 開發模式

- 使用 go mod/go work 管理依賴和多模組
- 利用泛型提升程式碼複用性（Go 1.18+）
- 使用 embed 嵌入靜態資源
- 結合 CI/CD、容器化、雲原生最佳實踐

---

> 建議多讀官方標準庫原始碼，關注 Go 官方部落格和社群，持續學習最新最佳實踐。 